<?php

/**
 * Контроллер управляет группой.
 * 
 * Основной функционал - статистика, очереди и антиспам.
 */
class Group2Controller extends Controller_Action
{
	public function indexAction()
	{
		$groupRow = $this->_getGroupRow();
		$this->view->group = $groupRow;
		
		$turnRowset = $groupRow->getTurnRowset();
		$this->view->turns = $turnRowset;
	}
	
	/**
	 * Создание или редактирование очереди для группы.
	 * 
	 * @throws Zend_Controller_Action_Exception
	 */
	public function turnAction()
	{
		$groupRow = $this->_getGroupRow();
		$this->view->group = $groupRow;
		
		// Определяем - создание или редактирование. В случае редактирования вытаскиваем очередь из базы.
		if ($turnId = $this->_getParam('turn_id')) {
			$turnRow = TurnPeer::getInstance()->find($turnId)->current();
			if (!$turnRow) {
				throw new Zend_Controller_Action_Exception("Очередь не найдена");
			}
			
			if ($turnRow->getGroupId() != $groupRow->getId()) {
				throw new Zend_Controller_Action_Exception('Очередь не связана с группой: ' . $groupRow->getName());
			}
		} else {
			$turnRow = TurnPeer::getInstance()->createRow();
			$turnRow->setGroupId($groupRow->getId());
			$turnRow->setCreatedAt(date('Y-m-d H:i:s'));
		}
		
		$this->view->turn = $turnRow;
		
		// Если мы уже не отправили форму - больше ничего не делаем, показываем ее.
		if (!$this->getRequest()->isPost()) {
			return;
		}
		
		try {
			Db::getConnection()->beginTransaction();
			if (!$this->_getParam('name')) {
				throw new Zend_Controller_Action_Exception('Не указано название очереди');
			}
			
			if (!trim($this->_getParam('time'))) {
				throw new Zend_Controller_Action_Exception('Не указано время');
			}
			
			// Удаляем все проставленное время для этой очереди
			if ($turnRow->getId()) {
				$select = TurnTimePeer::getInstance()->select();
				$select->where('turn_id = ?', $turnRow->getId());
				$turnTimeRowset = TurnTimePeer::getInstance()->fetchAll($select);
				foreach ($turnTimeRowset as $turnTimeRow) {
					$turnTimeRow->delete();
				}
			}
			
			// Сохраняем очередь в базе
			$turnRow->setName($this->_getParam('name'));
			$turnRow->setModifiedAt(date('Y-m-d H:i:s'));
			$turnRow->save();
			
			// Проставляем время для очереди в базе
			$time = explode("\n", $this->_getParam('time'));
			foreach($time as $t) {
				$t = trim($t);
				if (!$t) continue;
				if (!preg_match('/[0-9]{1,2}:[0-9]{2}/', $t)) {
					throw new Zend_Controller_Action_Exception('Не верный формат времени: ' . $t);
				}
				
				$timeRow = TurnTimePeer::getInstance()->createRow();
				$timeRow->setTurnId($turnRow->getId());
				$timeRow->setTime($t);
				$timeRow->setCreatedAt(date('Y-m-d H:i:s'));
				$timeRow->setModifiedAt(date('Y-m-d H:i:s'));
				$timeRow->save();
			}
			
			Db::getConnection()->commit();
			$this->_goto(array('action' => 'index', 'id' => $groupRow->getId()));
		} catch (Zend_Controller_Action_Exception $e) {
			Db::getConnection()->rollback();
			$this->view->error = $e->getMessage();
		} catch (Zend_Db_Exception $e) {
			Db::getConnection()->rollback();
			$this->view->error = $e->getMessage();
			throw $e;
		} catch (Exception $e) {
			Db::getConnection()->rollBack();
			throw $e;
		}
	}
}